import axios from 'axios'
import { getToken } from './auth'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: 'http://localhost:8000/', // 使用vite代理的api前缀
  timeout: 5000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = getToken()
    if (token) {
      config.headers['Authorization'] = `Token ${token}`
    }
    return config
  },
  error => {
    // 对请求错误做些什么
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data

    // 根据中间件返回的 code 进行不同处理
    if (res.code === 1000) {
      return res;
    } else if (res.code === 1001) {
      // 未授权，跳转到登录页
      console.log('未授权，请重新登录');
      return Promise.reject(new Error(res.message || '未授权'));
    } else if (res.code === 1003) {
      // 无权限
      console.log('无权限访问');
      return Promise.reject(new Error(res.message || '无权限'));
    } else if (res.code === 1004) {
      // 参数错误
      console.log('参数错误');
      return Promise.reject(new Error(res.message || '参数错误'));
    } else {
      // 其他错误
      console.log('操作失败');
      return Promise.reject(new Error(res.message || '操作失败'));
    }
  },
  error => {
    console.log('err' + error) // for debug
    ElMessage({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

/**
 * 封装get方法
 * @param url
 * @param params
 * @returns {Promise}
 */

export function fetch(url, params) {
  return new Promise((resolve, reject) => {
    service.get(url, {
      params: params
    })
      .then(response => {
        if (!response) return
        resolve(response.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function post(url, data) {
  return new Promise((resolve, reject) => {
    service.post(url, data)
      .then(response => {
        if (!response) return
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })
}

/**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url, data) {
  return new Promise((resolve, reject) => {
    service.put(url, data)
      .then(response => {
        if (!response) return
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })
}

/**
 * 封装delete请求
 * @param url
 * @returns {Promise}
 */

export function del(url) {
  return new Promise((resolve, reject) => {
    service.delete(url)
      .then(response => {
        if (!response) return
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })
}

export default service
